package ysjsonrpc

import (
	"gitee.com/kmyss/gf-ex/ysjsonrpc/internal"
	"github.com/gogf/gf/v2/encoding/gjson"
)

// FuncHandler JsonRPC 处理函数类型,传入 <params> 函数需要根据自己的要求获取数据.
// 传出参数为 <err> 不为空时返回 error 数据, 否则返回 <result> 数据.
type FuncHandler func(params interface{}) (result interface{}, err *JsonRPCError)

type JsonRPCReq struct {
	internal.JsonRPCBase
	Method string      `json:"method"`
	Params interface{} `json:"params"`
}

func DefaultReq() *JsonRPCReq {
	return NewJsonrpcReq(`{"jsonrpc": "2.0", "method": "", "params": null, "id": 0}`)
}

func NewJsonrpcReq(json string) *JsonRPCReq {
	req := &JsonRPCReq{}
	err := gjson.DecodeTo(json, req)
	if err != nil {
		return nil
	}
	return req
}

type JsonRPCRes struct {
	internal.JsonRPCBase
	Result interface{}   `json:"result,omitempty"`
	Error  *JsonRPCError `json:"error,omitempty"`
}

func (j *JsonRPCRes) Bytes() []byte {
	return []byte(j.JsonStr())
}

func (j *JsonRPCRes) JsonStr() string {
	return gjson.New(j).MustToJsonString()
}

func NewJsonRPCRes(req *JsonRPCReq) *JsonRPCRes {
	res := &JsonRPCRes{}
	res.JsonRPCBase = req.JsonRPCBase
	return res
}

func NewJsonRPCResWithError(req *JsonRPCReq, err *JsonRPCError) *JsonRPCRes {
	res := NewJsonRPCRes(req)
	res.Error = err
	return res
}

func NewJsonRPCResWithResult(req *JsonRPCReq, result interface{}) *JsonRPCRes {
	res := NewJsonRPCRes(req)
	res.Result = result
	return res
}
